package com.ciwong.mobilelib.utils.toast;

import android.content.Context;
import android.os.Handler;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.ciwong.mobilelib.R;

import java.util.LinkedList;
/**
 * date :2018/7/6
 * author: lzh
 * description: 此类可以1.自定义view，位置，图标资源 2.可以解决toast在有些手机上toast重叠问题
 * version:
 */

public abstract class BaseOToast {

    private Handler handler = new Handler();
    private LinkedList<Toast> list = new LinkedList<>();
    private boolean flag = true;
    private String TAG = "BaseOToast: ";

    /*  */

    /**
     * @param context  上下文
     * @param content  显示的文本
     * @param resIcon  显示的图标 -1代表没有图标
     * @param duration 显示的时长
     * @param view     自定义的view
     * @param gravity  -1 表示未设置
     * @param xOffset  -1 表示未设置 具体的int值
     * @param yOffset  -1 表示未设置 具体的int值
     */
    public void toastShow(Context context, CharSequence content, long duration, int resIcon, View view, int gravity, int xOffset, int yOffset) {
        try {
            Toast mToast = new Toast(context);
            mToast.setGravity(gravity == -1 ? Gravity.CENTER : gravity, xOffset == -1 ? 0 : xOffset, yOffset == -1 ? 0 : yOffset);//设置toast显示的位置，这是居中
            if (view == null) {//当view为空时 默认view
                view = LayoutInflater.from(context).inflate(R.layout.toast_custom_general, null);//自定义样式，自定义布局文件
                //图标处理
                ImageView ivToast = view.findViewById(R.id.iv_toast);
                if (resIcon > 0) {
                    ivToast.setVisibility(View.VISIBLE);
                    ivToast.setImageResource(resIcon);
                } else {
                    ivToast.setVisibility(View.GONE);
                }
                //文本处理
                TextView mTvToast = (TextView) view.findViewById(R.id.tv_toast);
                mTvToast.setText(content);//设置文本
            }
            mToast.setView(view);//设置自定义的view
            //显示时长处理
            mToast.setDuration(Toast.LENGTH_SHORT);//默认设置短时间显示
            if (duration == Toast.LENGTH_LONG || duration == Toast.LENGTH_SHORT) {
                mToast.setDuration((int) duration);
            }
            list.add(mToast);//转为8.0以上系统吐司叠加问题设计
            if (list.size() > 0 && flag) {
                flag = false;
                show(mToast, duration);//展示toast
            }
        } catch (Exception e) {
            Log.e(TAG, "toast Exception" + e.getMessage());
        }
    }

    /**
     * 销毁toast 防止内存泄露
     *
     * @param toast
     * @param duration
     */
    private void show(final Toast toast, long duration) {
        if (toast == null) return;
        list.remove(toast);
        long time = 0;
        if (toast != null) {
            toast.show();
        }
        if (duration == Toast.LENGTH_LONG)
            time = (long) (3.5 * 1000);
        else if (duration == Toast.LENGTH_SHORT)
            time = 2 * 1000;
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                cancelToast(toast);
                if (list.size() > 0) {//当toast还有时继续弹
                    show(list.getFirst(), list.getFirst().getDuration());
                } else {//当toast没有了，改变创建toast时，是否能进入展示
                    changeFlag();
                }
            }
        }, time);
    }

    private void changeFlag() {
        flag = true;
    }

    private void cancelToast(Toast toast) {
        if (toast != null) {
            toast.cancel();
        }
    }
}
